package at.dcmspl;

import java.io.File;
import java.io.IOException;
import java.io.PrintStream;
import java.rmi.RemoteException;
import java.util.LinkedList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.annotation.Resource;
import javax.ejb.*;

/**
 *
 * @author Hannes Stornig, Gosch Daniel
 */
@Stateful
@LocalBean
public class DcmFileExport implements DcmFileExportRemote, SessionSynchronization{
    
    public static final String TEMPORAERE_EXTENSION = ".tmp";
    public static final String ENDGUELTIGE_EXTENSION = ".dcm";
    
    @Resource//Enivironment-Entrie(default Wert im java code... kann beim deployemend geändert werden)
    String exportpfad = ".";//TODO Muss noch auf einen Ordner geandert werden
    @EJB
    FileNrProducer fileNrProducer;
    
    List<File> exportdateien = new LinkedList<File>();

    @Override
    public String getENDGUELTIGE_EXTENSION() {
        return ENDGUELTIGE_EXTENSION;
    }

    public String getTEMPORAERE_EXTENSION() {
        return TEMPORAERE_EXTENSION;
    }
    
    @Override//TODO Pfadangabe
    public String exportDcmFile(String dcmFileName) throws IOException {
        long dateinummer = fileNrProducer.naechsteDateinummer();
        String dateiname = dcmFileName + "-" + dateinummer;
        File exportdatei = new File(dateiname+TEMPORAERE_EXTENSION);
        exportdatei.createNewFile();
        exportdateien.add(exportdatei);
        PrintStream ps = new PrintStream(exportdatei);
        ps.println(dcmFileName);
        ps.close();
        return dateiname;
    }
        
    @Override
    public void removeDcmFile(String dcmFileName) throws IOException{
        File f = new File(dcmFileName);
        Logger.getLogger(DcmFileExport.class.getName()).log(Level.INFO, "###lösche {0}",f);
        if (f.exists()) {
            f.delete(); 
            Logger.getLogger(DcmFileExport.class.getName()).log(Level.INFO, "###{0} gelöscht",f);
        }else{
            Logger.getLogger(DcmFileExport.class.getName()).log(Level.INFO, "###Löschen von {0} nicht möglich",f);
        }
    }
    
    @Override
    public void afterBegin() throws EJBException, RemoteException {
	exportdateien.clear();
    }
    
    //Dateiendung von tmp nach dcm ändern
    @Override
    public void beforeCompletion() throws EJBException, RemoteException {
        for (int d = 0; d < exportdateien.size(); d++) {
            File exportdatei = exportdateien.get(d);
            File umbenannteDatei = new File(exportdatei.getName().replace(TEMPORAERE_EXTENSION, ENDGUELTIGE_EXTENSION));
            exportdatei.renameTo(umbenannteDatei);
            exportdateien.set(d, umbenannteDatei);
            //exportdatei.getName();
        }
    }
    
    //Lösche alle gemerkten Files falls der Commit schief läuft
    @Override
    public void afterCompletion(boolean commit) throws EJBException, RemoteException {
        if (!commit) {
            for (File exportdatei: exportdateien)
                exportdatei.delete();
        }
    }
    
}
